Node.js, Deno, Bunの比較 - どれを使うべきか?
はじめに
DenoやBunなどの登場により、どのランタイムを使うべきなのかに関する意見や疑問などを見かける機会が増えてきたような気がしました このページでは、各ランタイムへの個人的な印象や意見などについてまとめてみます
私の考えとして、以下のような立場で意見をまとめています
サーバーサイドランタイムとしてのNode.jsには概ね満足していて、大きな不満は特にない スクリプティングランタイムとしてのDenoはかなり気に入っている TL;DR
最初に結論だけ書いてしまうと、現時点(2024年)では、業務におけるフロントエンド・バックエンド開発においては、DenoやBunの採用は個人的にはまだ早いと思います (現状ではNode.jsを使うのがよいと思っています) それでも、もし現時点でDenoやBunを業務におけるフロントエンド・バックエンド開発に採用したいという場合は、まずはリスクの低い箇所(スクリプティング、社内システム/ツール、Faasにおける特定のFunctionなど)に対して局所的に採用して評価や検討をした上で、段階的に採用を進めていくのが個人的には良いと思います それぞれのよい点について
(2024年時点) 誕生から15年近く経過しており、この中では最も高い安定性が期待できる
(2024年時点) 基本的にフロントエンドのエコシステムの多くはNode.jsを想定して開発されているため、そういった最新のツールなどを採用しやすい ただ現状ではおそらく多くの場合、deno run -Aで実行されるケースが結構多いのではないかとも思うので、パーミッションシステムの存在が他のランタイムと比較したときに、どれほどメリットになるのかは正直わからないです
パッケージレベルでパーミッションを制御したいという要望はいくつか上がっていて、これがサポートされると実用度が上がる可能性はあるかもしれないと思いました () 元々、DenoはWeb標準への準拠を重視していたこともあり、この分野ではDenoが一番優位だと思う (2024年時点) (2024年時点) この点ではBunの方が有利だと思う 自分はスクリプティングでの体験の良さを気に入ってDenoを使い始めたので、これが個人的には一番よい点だと思う ただし、Denoとは異なり、型チェックについては別途、tscを使う必要あり (2024年時点) フロントエンド開発で使用するなら個人的にはDenoよりもBunの方が有利だと思う (おそらく意図的なものなのだとは思いますが) Bunは標準などから大きく外れた機能を導入することが多々あり、人によって好き嫌いが分かれやすい部分だとは思いますが、気にいる人にはかなり刺さる特徴なのではないかと思います 例)
所感
個人的な好み
スクリプティングやCLIツールの開発における使い勝手や体験の良さ、Web標準への準拠など、私はDenoはとても気に入っています 特にスクリプティングにおいての体験が素晴らしく、定型的な作業の効率化などではとても便利だと思っています
どれを採用するのが良いか?
先程、自分はDenoをとても気に入っているとは書きましたが、現時点(2024年)では特別な理由が無い限り、業務でのWeb開発においては、まだNode.js一択だと個人的には思っています また、Node.jsも進化が止まっているわけではなく、継続的にそういった欠点などの改善も試みられています Node.jsは現状では最も安定性が高く、開発においてつまずく可能性も低い 私個人の印象として、Node.jsはエコシステムがやや乱立しがち※であり、労力などが分散してしまう分、個々のORMやフレームワークなどの成熟度ではRailsやJava, C#あたりと比較するとどうしてもやや低い印象があります。ただでさえそのあたりでのリスクがある上でWeb開発においてDenoやBunなどを採用するのは、現状では正直かなりリスキーであると個人的には思います ※乱立しがちであるというのは選択肢が多いというメリットとも考えられるため、一概に悪いことであるとは言えないとも思います
例えば、以下の記事などでも言及されているように、プロダクトのコアに十分に検証していない技術を採用することには大きなリスクがあり、また当初期待していた程のメリットを得られない可能性もある (新しい技術を採用した結果、却ってそれが負債となってしまう可能性がある)
事前にきちんと検証や調査などをしてから採用を判断すると安全だと思います
現時点でDenoやBunをWeb開発で本格的に使おうとする場合、「〜のnpmパッケージが動かない」「Node.jsと異なる振る舞いをする」「〜を実現するライブラリがまだない」「アップデートしたら〜のnpmパッケージが動かなくなった」などといったリスクがまだまだ発生すると思います。どちらもBetter Node.jsとして使うには、まだハマりどころが結構出てきてしまうと思います DenoやBunにはNode.jsにはないメリットが多くあることは事実だとは思うものの、業務におけるバックエンドやフロントエンドの開発においてはまだ時期尚早だと思う (2024年時点) 例えば、大規模なB2Bサービスの開発で採用することなどを考えた際に、DenoやBunが提供するメリットは、Node.jsが提供する安定性やシェア、情報量が豊富であることなどのメリットを現状では上回らない、というのが個人的な考えです (現状では正直、苦労することの方が多いと思います) また、Deno Deployが提供するDeno KVは、キャッシュやPub/Sub、メッセージングなどの選択肢の一つとしては悪くはないとは思うものの、大規模なサービスにおける永続化層として全面的に採用するには正直やや心許ないというのが個人的な印象です。(特に数千以上ものテーブルが必要となるような大規模なB2Bサービスの開発などにおいては、例えば関係データベースが提供するリレーションやトランザクション、行レベルセキュリティなどの仕組みは非常に有用だと思っています) このあたりは各種NewSQLであったりTursoなどの技術が発達していくと改善されていく可能性はあるのかもしれないですが、正直どうなるのかはちょっとまだわからないです また、Deno/Bun/Node.jsはどれも採用している言語が同じで かつ npmという同一のエコシステムにも依存していることもあり、ランタイムに関してあえてリスクを犯してまで新しいものに乗っかるメリットが正直そこまで大きくない、という事情もあります Node.jsも別にレガシーなプロダクトというわけではなく、現在でも積極的に新しいものが開発されています 新しい技術を採用したからといって、必ずしも既存の課題や問題が魔法のように解決するとは限らないです。Hype Driven Developmentに陥ってしまわないように注意するとよいでしょう。実際に採用するかどうかは、評判などだけで判断するのではなく、きちんと検証や調査を実施してから判断するのがよいと思います。 参考までにDenoの使用事例をまとめているため、よろしければこちらなども参照ください🙇♂️ また、Denoには開発初期のセットアップ作業がかなり楽になるというメリットはあるものの、実際のWeb開発においてはそう何度も初期セットアップを行うようなことはまれなはずなので、あまり恩恵はない (ただし、スクリプティングなどにおいてはこのメリットの恩恵は受けやすいはず) こういった機能はWeb開発ではなく、どちらかといえばスクリプティングなどの方が恩恵を受けやすいと思います
具体的には永続化に関する要件が厳しくなく、Deno KVで十分にワークするようなケースなど この時点でtoBのSaaSなどでの採用は、現時点ではほとんどの場合、選択肢から外れてしまうのではないかと思います
(2024年時点) Bunの場合も、もし採用するとしても、当面はCIでNode.jsとBunの両方で同じテストを実行しておき、何か問題があった際にすぐにNode.jsへロールバックできるようにしておくと安全かもしれません ただし、現時点では、そこまで苦労して移行する意義があるかどうかは正直なところ疑わしいとは思います
今後、Node.jsとの互換性は少しずつ改善されていくはずなので、もう少し待ってから移行をした方が、結果としてはよりスムーズに進めやすいのではないかと思っています また、数年後にはDenoとBunはどちらももNode.jsとの互換性がさらに改善されているはずなので、もしNode.jsからそれらへ移行をしたいというようなケースが出てきたとしても、将来的にはハードルは下がっている可能性が高いと思います ただし、スクリプティングやCLIツール、Vimプラグインなどの開発ではDenoやBunはかなり使い勝手が良く、この分野での採用はアリだと思います なので、もしDenoやBunの採用を考える場合は、このあたりから少しずつ進めていくのがよいと思っています これは用途や好みなどによって異なってくるのではないかと思っています
スクリプティングにおいては、どちらもそこまで差はないはず
CLIツールを作成したい場合も、そこまで差はないはず
Denoはhttps:やnpm:などによるライブラリのimportや動的なダウンロードなどの機能があります。この仕組みにはプラグインシステムを備えたアプリケーションを開発したい場合、外部ライブラリに依存したプラグインを開発・配布しやすいというメリットがあると考えられます。こういったプラグインシステムを提供するCLIアプリなどを開発する場合、Denoはとても相性が良いのではないかと思います (実際にdenops.vimではその仕組みが活用されています) フロントエンドでSPAを開発したいケースなどではBunの方が向いているのではないかと思っています 標準への準拠について
また、WinterCGでは各ランタイムでのAPIなどを標準化するための取り組みが行われています Node.jsでは (おそらくDenoやBunの影響もあって) パーミッションシステムの実装や単一実行可能ファイルの作成などのサポートが進められつつあります こういった動きもあり、将来的にはそれぞれのランタイム間の差異は徐々に縮まっていく可能性は比較的高いのではないかと思う
現時点では、できるだけこういった標準に準拠している または しやすい選択肢を採用しておくと、今後の変化に対応しやすいのではないかと思う (Remix, Honoなど) 終わりに
私の意見としては、バックエンドやフロントエンドの開発においてNode.jsではなくDenoやBunを採用するのは現時点ではまだリスキーであると思っています (ただし、CLIやスクリプティングなどにおけるDenoやBunの採用は現時点でもありだと思っています) ただし、どのランタイムもWeb標準への対応は少しずつ改善されつつあります。また、HonoやRemixなどのWeb標準を意識したフレームワークも登場しています。 そのため、これから相互運用性が少しずつ改善されていけば、各ランタイムの移行や併用などはしやすくなってくると思っており、それまでは本格的な採用は見送る方が安全なのではないかと個人的には思っています
DenoもBunもNode.jsとの互換性の改善にはかなり力が入れられているので、将来的にはよりスムーズに移行や採用などはしやすくなるはずです 少し批判的な内容も書いてしまいましたが、DenoもBunもかなり注目は浴びており、コミュニティなども活発に見えるため、個人的にはどちらもかなり期待しています 私はDenoをスクリプティングの用途で日々使っていて、とても使い勝手がよく感じています。DenoにせよBunにせよまずはスクリプティングなどの小さな部分から少しずつ採用していくのが良いのではないかと思っています 関連ページ